package com.example.airhockeytextured.data

import android.opengl.GLES20
import android.opengl.GLES20.GL_FLOAT
import android.opengl.GLES20.glEnableVertexAttribArray
import com.example.airhockeytextured.Constants.BYTES_PER_FLOAT
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.FloatBuffer

/**
 * @author Liujianyou
 * @date 2020/8/6
 * @des
 */
class VertexArray constructor(vertexData: FloatArray) {

    private val floatBuffer: FloatBuffer by lazy {
        //分配一块本地内存，这块内存不会被垃圾回收器管理，
        ByteBuffer.allocateDirect(vertexData.size * BYTES_PER_FLOAT)
            //按照本地字节序排列
            .order(ByteOrder.nativeOrder())
            //转回成浮点型实例
            .asFloatBuffer()
            //将数据从内存复制到刚分配的本地内存`
            .put(vertexData)
    }


    /*创建一个通用的方法将着色器中的属性与数据关联起来*/
    fun setVertexAttributePointer(
        dataOffset: Int,
        attributeLocation: Int,
        componentCount: Int,
        stride: Int
    ) {
        //这句话的意思是保证openGL在从本地内存的缓冲区读取数据之前，能够从指定的dataOffset位置读取数据
        floatBuffer.position(dataOffset)
        //调用glVertexAttribPointer告诉OpenGL 可以在缓冲区floatBuffer中查找attributeLocation对应的数据
        GLES20.glVertexAttribPointer(
            attributeLocation,
            componentCount,
            GL_FLOAT,
            false,
            stride,
            floatBuffer
        )
        //需要通过这个调用告诉openGl去哪里找到这些数据
        glEnableVertexAttribArray(attributeLocation)
        floatBuffer.position(0)
    }
}